/**
 * @file ControlObj.hpp
 * @brief 设备控制接口，作为`ControlCollege`的控制单元
 */

#ifndef CONTROL_OBJ_H
#define CONTROL_OBJ_H

#include "CameraDriver/Base/Camera.hpp"
#include "CameraDriver/Base/Driver.hpp"
#include "RecordFile.hpp"
#include "ShareMem.hpp"

class ControlCollege;
/**
 * @class ControlObj
 * @brief 封装的控制对象
 *
 */
class ControlObj {
private:
  friend class ControlCollege;
  BaseCamera *camera;
  BaseDriver *driver;
  ShareMem *mem;
  RecordFile *record = nullptr;
  void HandleOffline();
  void HandleNewImage(long frameID, char *data, const std::string &additional);
  void HandleCameraMessage(std::string inf);
  void DoCameraCase(std::function<void()> realtime,
                    std::function<void()> storage);
  long RecordImgSize;
  long PreviewImgSize;
  bool RecordStatus = false;
  bool ShotStatus = false;
  ControlCollege *manager;
  std::string UUID;
  std::vector<BaseConfig::item> SettingItemBuffer;

public:
  /**
   * @brief 构造函数
   * @note
   * 参数中所有的指针均为托管
   *
   * @param manager 持有该对象的`ControlCollege`指针
   * @param driver 相机驱动对象
   * @param camera 相机控制对象
   */
  ControlObj(ControlCollege *manager, BaseDriver *driver, BaseCamera *camera);
  /**
   * @brief 析构函数
   */
  virtual ~ControlObj();
  /**
   * @brief 开始拍摄
   */
  void StartShot();
  /**
   * @brief 停止拍摄
   */
  void StopShot();
  /**
   * @brief 开始录制
   *
   * @param format 文件格式
   * @param path 存储路径
   */
  void StartRecord(BaseFormat *format, const std::filesystem::path &path);
  /**
   * @brief 停止录制
   */
  void StopRecord();
  /**
   * @brief 获取拍摄状态
   *
   * @return `true`正在拍摄,`false`未拍摄
   */
  bool GetShotStatus();
  /**
   * @brief 获取录制状态
   *
   * @return `true`正在录制,`false`未录制
   */
  bool GetRecordStatus();
  /**
   * @brief 获取共享内存信息
   * @return
   * 1. 共享内存名称
   * 2. 信号量名称
   * 3. 共享内存大小
   */
  std::tuple<std::string, std::string, long> GetShareMemInf();
  /**
   * @brief 获取录制图像信息
   * @return 图片信息
   */
  BaseCamera::ImgInf GetRecordImageInf();
  /**
   * @brief 获取预览图像信息
   * @return 图片信息
   */
  BaseCamera::ImgInf GetPreviewImageInf();
  /**
   * @brief 获取参数列表
   * @return JSON字符串
   *
   */
  std::string /*json*/ GetSettingList();
  /**
   * @brief 获取参数
   * @return JSON字符串
   *
   * @param setid 设置ID
   */
  std::string /*json*/ GetSettingValue(long setid);
  /**
   * @brief 设置参数
   *
   * @param value JSON字符串
   * @return `true`设置成功,`false`设置失败
   */
  bool SetSettingValue(const std::string &value);
  /**
   * @brief 获取实时帧率
   *
   * @return 当前帧率
   */
  float GetFPS();
};

#endif
